//迭代器设计模式

// 场景：你我协同开发一个任务清单应用

// 我的代码 =================================
const todos ={
    life:['吃饭','睡觉','打豆豆'],
    learn:['语文','数学','外语'],
    work:['喝茶'],

    each:function(callback){ // 对外提供了统一遍历的接口
        const all = [].concat(this.life,this.learn,this.work)
        for(const item of all){
            callback(item)
        }
    },
/*迭代器模式核心就是对外提供统一遍历接口，让外部不用再去关心内部的结构是怎样的，只不过上面的each方法只适用于当前对象结构.
ES2015中的迭代器，它是语言层面实现的迭代器模式，适用于任何数据结构，只需要通过代码实现iterator方法实现它的迭代逻辑就可以了 */
    [Symbol.iterator]:function(){
        const all = [...this.life,...this.learn,...this.work]
        let index = 0
        return{
            next:function(){
                return{
                    value:all[index],
                    done:index++ >= all.length
                }
            }
        }
    }
}

// 你的代码====================================

// for(const item of todos.life){
//     console.log(item)
// }

// for(const item of todos.learn){
//     console.log(item)
// }
// for(const item of todos.work){
//     console.log(item)
// }
//当前对象的统一对外遍历方法
todos.each(function(item){
    console.log(item)
})

console.log('---------------------')

for(const item of todos){
    console.log(item)
}
//强类型与弱类型(类型安全的角度) :语言层面限制函数的实参类型必须与形参类型相同

class Main{
    static void foo(int num){// 强类型，接收一个整型的参数，调用时就不允许传入其它类型的值
        System.out.println(num);
    }

    public static void main(String[] args){
        Main.foo(100);// ok
        Main.foo('100');// error "100" is a string
        Main.foo(Integer.parseInt("100"))//ok  传入前转化成整型的数字
    }
}
//弱类型，弱类型语言层面不会限制实参的类型
function foo(num){// 调用时任然可以传入任意类型数据，语法上是不会报错的，运行上可能出问题
    console.log(num)
}

foo(100) //ok
foo('100')//ok
foo(parseInt('100'))//ok

/*由于这种强弱类型之分根本不是某一个权威机构的定义，强类型有更强的类型约束，而弱类型中几乎没有什么约束，强类型语言中不允许任意的隐式类型转换，
而若类型语言则允许任意的数据隐式类型转换，比如我们这需要的是一个数字，而你放了个字符串也是可以的。变量类型允许随时改变的特点，不是强弱类型的差异 */
//python 是一门强类型的语言，但是变量任然是可以随时改变类型的

//静态类型与动态类型(类型检查的角度)

/*静态类型:一个变量声明时它的类型就是明确的，声明过后，它的类型就不允许再修改*/
/*动态类型:运行阶段才能够明确变量类型,而且变量的类型随时可以改变*/

var foo = 100

foo = 'bar' //ok 运行过程中被赋予字符串，也是允许的，动态类型语言中的变量没有类型，变量中存放的值室友类型的，JavaScript就是一门标准的动态类型语言

console.log(foo)

// 弱类型就是动态类型，强类型就是静态类型，这种说法是不正确的